﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using CapaDeDatos.EF;
using CapaDeDominio;
using CapaDeDatos;

namespace CapaDePrueba
{

    [TestFixture]
    public class TestLocalDAO
    {
        private ILocalDAO localDAO = null; // Clase DAO que se va a probar
        private int codigoGenerado = 0; // Código de Local que se genera en Crear() y se utiliza para el resto de pruebas

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            localDAO = new CapaDeDatos.EF.LocalDAO();
            localDAO.Crear(new Local
            {
                Nombre = "Local 0",
                Direccion = "Lince"
               
            });
            localDAO.Crear(new Local()
            {
                Nombre = "Local 3",
                Direccion = "Pueblo Libre"
                
            });
        }
        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(localDAO);

            Local LocalAcrear = new Local();
            LocalAcrear.Nombre = "Local 1";
            LocalAcrear.Direccion = "San Isidro";
            
            // 3. Declaramos la entidad que contendrá el resultado
            Local localCreado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localCreado = localDAO.Crear(LocalAcrear);
                codigoGenerado = localCreado.Codigo;
            }, "cliente creado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localCreado);
            // Probamos que el código generado sea mayor a 0
            Assert.Greater(localCreado.Codigo, 0);
            // Probamos que los nombres registrado es igual al solicitado con la entidad
            Assert.AreEqual(localCreado.Nombre, localCreado.Nombre);
            // Probamos que el apellido registrado es igual a la solicitada con la entidad
            Assert.AreEqual(localCreado.Direccion, LocalAcrear.Direccion);
            
        }
        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Definimos los datos para la prueba
            int codigo = codigoGenerado;
            // 3. Declaramos la entidad que contendrá el resultado
            Local localObtenido = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                localObtenido = localDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(localObtenido);
            Assert.AreEqual(localObtenido.Codigo, codigo);
            Assert.IsNotNullOrEmpty(localObtenido.Nombre);
            Assert.IsNotNullOrEmpty(localObtenido.Direccion);
            
        }        
        [Test]
        public void Test5_ListarTodos()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(localDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Local> LocalEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                LocalEncontrados = localDAO.ListarTodos();
            }, "Local encontrados");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(LocalEncontrados);
            // Probamos que la cantidad de locales encontrados sea 2
            Assert.AreEqual(LocalEncontrados.Count, 2);
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Local LocalEncontrado in LocalEncontrados)
            {
                Assert.IsNotNull(LocalEncontrado);
                Assert.IsInstanceOf(typeof(Local), LocalEncontrado);
            }
        }
    }
    }